"""
和文本操作相关的模块
"""
import pygame
import position as position_mo


def gen_sys_font_obj(
        name: str = 'Microsoft YaHei UI',
        size: int = 16,
        bold: bool = False,
        italic: bool = False
) -> pygame.font.Font:
    """
    生成系统字体对象
    :param name: 字体名称
    :param size: 字体大小
    :param bold: 字体是否加粗
    :param italic: 字体是否倾斜
    :return: pygame SysFont 对象
    """
    return pygame.font.SysFont(name, size, bold, italic)


def gen_text_obj(
        text: str,
        color: tuple[int, int, int] | tuple[int, int, int, int] | str = (0, 0, 0),
        font_name: str = 'Microsoft YaHei UI',
        font_size: int = 16,
        font_bold: bool = False,
        font_italic: bool = False,
) -> pygame.Surface:
    """
    生成文本对象
    :param text: 文本内容
    :param color: 文本文字的颜色
    :param font_name: 文本字体名称
    :param font_size: 文本字体大小
    :param font_bold: 文本字体是否加粗
    :param font_italic: 文本字体是否倾斜
    :return: 文本 Surface 对象
    """
    # 生成系统字体对象
    font = gen_sys_font_obj(font_name, font_size, font_bold, font_italic)
    # 生成文本对象
    return font.render(text, True, color)


def draw_text(
        text: str | pygame.Surface,
        target: pygame.Surface,
        position: tuple[int, int] = (0, 0),
        is_h_center: bool = False,
        is_v_center: bool = False,
        text_color: tuple[int, int, int] | tuple[int, int, int, int] | str = (0, 0, 0),
        font_name: str = 'Microsoft YaHei UI',
        font_size: int = 16,
        font_bold: bool = False,
        font_italic: bool = False,
):
    """
    绘制文本
    :param text: 文本内容
    :param target: 文本要绘制到的 Surface 对象
    :param position: 文本在目标 Surface 对象中的绘制位置
    :param text_color: 文本文字颜色
    :param is_h_center: 文本是否在目标 Surface 对象中水平居中
    :param is_v_center: 文本是否在目标 Surface 对象中垂直居中
    :param font_name: 文本字体名称
    :param font_size: 文本字体大小
    :param font_bold: 文本字体是否加粗
    :param font_italic: 文本字体是否倾斜
    :return: 文本 Surface 对象和文本 Rect 对象组成的元组
    """
    text_obj = text
    # 如果传入的文本参数为文本内容字符串，则生成文本 Surface 对象
    if isinstance(text, str):
        text_obj = gen_text_obj(text, text_color, font_name, font_size, font_bold, font_italic)
    # 对文本在目标 Surface 对象中绘制位置的居中处理
    position = position_mo.center(text_obj, target, position, is_h_center, is_v_center)
    # 将文本对象绘制到目标 Surface 对象
    text_rect = target.blit(text_obj, position)
    return text_obj, text_rect
